In this notebook we test our Khovanov homology obstruction for positivity on the low-crossing knots (of crossing number at most 12) and on the census knots (for which we know the Khovanov homology).

We start with the low crossing knots. For that we load the KnotInfo data.

In [1]:
import snappy
import csv
In [2]:
knot_info=[]
with open('knotinfoKH.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        knot_info.append(row)
print(knot_info[0])
['Name', 'DT Name', 'Fibered', 'Positive', 'KH Unred Z Poly', 'KH Red Z Poly', 'KH Red Q Poly', 'KH Red Mod2 Poly', 'KH Odd Z Poly', 'KH Odd Q Poly', 'KH Odd Mod2 Poly', 'HFK Polyomial']
In [3]:
KH.<q,t,T> = LaurentPolynomialRing(ZZ,3)

KNOTINFO=[]
for x in knot_info[1:]:
    data=[x[0],x[1],x[2],x[3]]
    for i in [4,5,6,7,8,9,10]:
        string=x[i]
        s=string.replace('^','**')
        s=s.replace(' ','')
        s=s.replace(')t',')*t')
        s=s.replace(')q',')*q')
        s=s.replace(')T',')*T')
        s=s.replace('qt','q*t')
        s=s.replace('0t','0*t')
        s=s.replace('1t','1*t')
        s=s.replace('2t','2*t')
        s=s.replace('3t','3*t')
        s=s.replace('4t','4*t')
        s=s.replace('5t','5*t')
        s=s.replace('6t','6*t')
        s=s.replace('7t','7*t')
        s=s.replace('8t','8*t')
        s=s.replace('9t','9*t')
        s=s.replace('0q','0*q')
        s=s.replace('1q','1*q')
        s=s.replace('2q','2*q')
        s=s.replace('3q','3*q')
        s=s.replace('4q','4*q')
        s=s.replace('5q','5*q')
        s=s.replace('6q','6*q')
        s=s.replace('7q','7*q')
        s=s.replace('8q','8*q')
        s=s.replace('9q','9*q')
        s=s.replace('qt','q*t')
        s=s.replace('tq','t*q')
        s=s.replace('t(','t*(')
        s=s.replace(')t',')*T')
        s=s.replace('Qt','Q*T')
        s=s.replace('0t','0*T')
        s=s.replace('1t','1*T')
        s=s.replace('2t','2*T')
        s=s.replace('3t','3*T')
        s=s.replace('4t','4*T')
        s=s.replace('5t','5*T')
        s=s.replace('6t','6*T')
        s=s.replace('7t','7*T')
        s=s.replace('8t','8*T')
        s=s.replace('9t','9*T')
        s=s.replace('0Q','0*Q')
        s=s.replace('1Q','1*Q')
        s=s.replace('2Q','2*Q')
        s=s.replace('3Q','3*Q')
        s=s.replace('4Q','4*Q')
        s=s.replace('5Q','5*Q')
        s=s.replace('6Q','6*Q')
        s=s.replace('7Q','7*Q')
        s=s.replace('8Q','8*Q')
        s=s.replace('9Q','9*Q')
        s=s.replace('Qt','Q*T')
        s=s.replace('tQ','T*Q')
        s=s.replace('QT','Q*T')
        s=s.replace('TQ','T*Q')
        s=s.replace('t(','T*(')
        kh=KH(eval(s))
        data.append(kh)
    KNOTINFO.append(data)
In [4]:
def KH_positivity_obstruction(KH_poly):
    '''If K is a positive knot the following properties are known about its Khovanov homologies KH^(i,j):
    (1) KH^(i,j)=0 if i<0
    (2) KH^(0,2g-1)=F where g is the genus of K (for a link -Eulercharacteristic)
    (3) KH^(0,2g+1)=F 
    (4) KH^(1,2g+1)=F^p1 where p1 is the chromatic number of the reduced Seifert graph of a positive diagram
    (5) KH^(1,2g+1)=0 if and only if K is fibered
    (6) KH^(0,j)=0 for all other j
    (7) KH^(1,j)=0 for all other j
    (8) KH^(i,2g-1)=0 for all other i
    (9) KH^(0,2g+1)=0 for all other i
    
    This function takes as input a Khovanov polynomial of a knot. And outputs False if any of these conditins 
    is not fulfilled. (Except for checking that the genus is correct and the fiberedness condition.)
    Otherwise it will print the above non-vanishing terms, together with its possible fiberedness status, and genus. 
    By computing the fiberedness status and the genus 
    (for example by computing the knot Floer homology) the above obstructions can sometimes be improved.
    '''
    fiberedness=None
    try:
        kh=t*KH_poly.derivative(t)(q,0,0)+KH_poly(q,0,0)
    except ZeroDivisionError:
        return False
    exp=kh.exponents()
    if len(exp)>3:
        return False
    if len(exp)<2:
        return False
    if len(exp)==3:
        fiberedness=False
        g=int((exp[2][0]+1)/2)
        if exp[2][1]!=0:
            return False
        if exp[1][1]!=0:
            return False
        if exp[1][0]!=2*g+1:
            return False
        if exp[0][0]!=2*g+1:
            return False
        if exp[0][1]!=1:
            return False
    if len(exp)==2:
        fiberedness=True
        g=int((exp[1][0]+1)/2)
        if exp[1][1]!=0:
            return False
        if exp[0][1]!=0:
            return False
        if exp[0][0]!=2*g+1:
            return False
    pol=KH_poly
    for count in range(0,2*g-1):
        pol=pol.derivative(q)
    try:
        qmin=q**(2*g-1)*pol(0,t,0)
    except ZeroDivisionError:
        return False
    if len(qmin.exponents())!=1:
        return False
    pol=pol.derivative(q)
    pol=pol.derivative(q)
    try:
        qalmmin=q**(2*g+1)*pol(0,t,0)
    except ZeroDivisionError:
        return False
    if fiberedness:
        if len(qalmmin.exponents())!=1:
            return False
    if fiberedness==False:
        if len(qalmmin.exponents())!=2:
            return False
    return [kh,fiberedness,g]
    
    
In [5]:
def KH1(KH_poly):
    '''Returns KH in homological grading 1 (if KH is non-negative).'''
    try:
        return KH_poly.derivative(t)(q,0,0)
    except ZeroDivisionError:
        return False

First we verify that our obstructions are fullfilled for positive knots:

In [6]:
for x in KNOTINFO:
    if x[3]=='Y':
        if KH_positivity_obstruction(x[4])==False:
            print('Obstruction is NOT working for:',x[1])
        else:
            [kh,fib,genus]=KH_positivity_obstruction(x[4])
            knot_floer=snappy.Manifold('K'+x[1].replace('_','')).link().knot_floer_homology()
            if fib!=knot_floer.get('fibered'):
                print('Obstruction is NOT working for:',x[1])
            if genus!=knot_floer.get('seifert_genus'):
                print('Obstruction is NOT working for:',x[1])
            print(x[1],kh)
            
3a_1 q^3 + q
5a_2 q^5 + q^3
5a_1 q^3*t + q^3 + q
7a_7 q^7 + q^5
7a_4 q^3*t + q^3 + q
7a_5 q^5*t + q^5 + q^3
7a_6 2*q^3*t + q^3 + q
7a_3 q^5*t + q^5 + q^3
8a_2 2*q^5*t + q^5 + q^3
8n_3 q^7 + q^5
9a_41 q^9 + q^7
9a_27 q^3*t + q^3 + q
9a_38 q^7*t + q^7 + q^5
9a_35 q^5*t + q^5 + q^3
9a_36 2*q^3*t + q^3 + q
9a_23 q^7*t + q^7 + q^5
9a_26 q^5*t + q^5 + q^3
9a_33 q^7*t + q^7 + q^5
9a_39 2*q^5*t + q^5 + q^3
9a_34 2*q^5*t + q^5 + q^3
9a_25 q^7*t + q^7 + q^5
9a_24 2*q^5*t + q^5 + q^3
9a_16 2*q^5*t + q^5 + q^3
9a_40 2*q^3*t + q^3 + q
9a_30 3*q^5*t + q^5 + q^3
9n_8 2*q^5*t + q^5 + q^3
10a_13 2*q^7*t + q^7 + q^5
10a_14 3*q^5*t + q^5 + q^3
10a_9 2*q^5*t + q^5 + q^3
10a_51 2*q^5*t + q^5 + q^3
10a_40 2*q^7*t + q^7 + q^5
10a_8 2*q^7*t + q^7 + q^5
10a_45 3*q^5*t + q^5 + q^3
10a_102 4*q^5*t + q^5 + q^3
10n_21 q^9 + q^7
10n_22 q^7*t + q^7 + q^5
10n_6 q^7*t + q^7 + q^5
10n_27 q^9 + q^7
10n_30 q^7*t + q^7 + q^5
10n_36 q^9 + q^7
10n_7 q^7 + q^5
10n_31 q^7 + q^5
11a_43 3*q^7*t + q^7 + q^5
11a_94 2*q^7*t + q^7 + q^5
11a_95 2*q^5*t + q^5 + q^3
11a_123 3*q^5*t + q^5 + q^3
11a_124 3*q^7*t + q^7 + q^5
11a_186 2*q^7*t + q^7 + q^5
11a_191 2*q^7*t + q^7 + q^5
11a_192 3*q^5*t + q^5 + q^3
11a_200 2*q^5*t + q^5 + q^3
11a_227 3*q^7*t + q^7 + q^5
11a_234 q^9*t + q^9 + q^7
11a_235 2*q^7*t + q^7 + q^5
11a_236 2*q^7*t + q^7 + q^5
11a_237 3*q^5*t + q^5 + q^3
11a_238 2*q^5*t + q^5 + q^3
11a_240 q^9*t + q^9 + q^7
11a_241 2*q^7*t + q^7 + q^5
11a_242 q^7*t + q^7 + q^5
11a_243 2*q^5*t + q^5 + q^3
11a_244 3*q^7*t + q^7 + q^5
11a_245 q^7*t + q^7 + q^5
11a_246 q^5*t + q^5 + q^3
11a_247 q^3*t + q^3 + q
11a_263 q^9*t + q^9 + q^7
11a_291 3*q^7*t + q^7 + q^5
11a_292 4*q^5*t + q^5 + q^3
11a_298 3*q^7*t + q^7 + q^5
11a_299 3*q^5*t + q^5 + q^3
11a_318 3*q^7*t + q^7 + q^5
11a_319 3*q^7*t + q^7 + q^5
11a_320 3*q^5*t + q^5 + q^3
11a_329 4*q^5*t + q^5 + q^3
11a_334 q^9*t + q^9 + q^7
11a_335 2*q^7*t + q^7 + q^5
11a_336 2*q^7*t + q^7 + q^5
11a_337 3*q^5*t + q^5 + q^3
11a_338 q^9*t + q^9 + q^7
11a_339 q^7*t + q^7 + q^5
11a_340 2*q^7*t + q^7 + q^5
11a_341 2*q^5*t + q^5 + q^3
11a_342 q^5*t + q^5 + q^3
11a_343 2*q^3*t + q^3 + q
11a_353 3*q^7*t + q^7 + q^5
11a_354 3*q^5*t + q^5 + q^3
11a_355 q^9*t + q^9 + q^7
11a_356 2*q^7*t + q^7 + q^5
11a_357 2*q^7*t + q^7 + q^5
11a_358 q^7*t + q^7 + q^5
11a_359 2*q^5*t + q^5 + q^3
11a_360 2*q^5*t + q^5 + q^3
11a_361 2*q^5*t + q^5 + q^3
11a_362 2*q^3*t + q^3 + q
11a_363 2*q^3*t + q^3 + q
11a_364 q^9*t + q^9 + q^7
11a_365 2*q^7*t + q^7 + q^5
11a_366 3*q^5*t + q^5 + q^3
11a_367 q^11 + q^9
11n_77 q^9 + q^7
11n_93 2*q^7*t + q^7 + q^5
11n_126 2*q^7*t + q^7 + q^5
11n_136 2*q^7*t + q^7 + q^5
11n_169 2*q^7*t + q^7 + q^5
11n_171 3*q^5*t + q^5 + q^3
11n_180 2*q^7*t + q^7 + q^5
11n_181 2*q^5*t + q^5 + q^3
11n_183 q^7 + q^5
12a_43 3*q^7*t + q^7 + q^5
12a_52 2*q^9*t + q^9 + q^7
12a_53 3*q^7*t + q^7 + q^5
12a_55 2*q^7*t + q^7 + q^5
12a_56 2*q^5*t + q^5 + q^3
12a_82 3*q^7*t + q^7 + q^5
12a_93 2*q^9*t + q^9 + q^7
12a_94 3*q^7*t + q^7 + q^5
12a_96 2*q^7*t + q^7 + q^5
12a_97 3*q^5*t + q^5 + q^3
12a_102 4*q^7*t + q^7 + q^5
12a_107 4*q^7*t + q^7 + q^5
12a_143 2*q^9*t + q^9 + q^7
12a_144 3*q^7*t + q^7 + q^5
12a_145 3*q^7*t + q^7 + q^5
12a_152 3*q^5*t + q^5 + q^3
12a_156 3*q^5*t + q^5 + q^3
12a_276 2*q^9*t + q^9 + q^7
12a_277 2*q^7*t + q^7 + q^5
12a_293 3*q^7*t + q^7 + q^5
12a_295 3*q^7*t + q^7 + q^5
12a_319 3*q^7*t + q^7 + q^5
12a_320 3*q^5*t + q^5 + q^3
12a_344 2*q^7*t + q^7 + q^5
12a_345 2*q^5*t + q^5 + q^3
12a_355 2*q^7*t + q^7 + q^5
12a_356 2*q^5*t + q^5 + q^3
12a_367 2*q^9*t + q^9 + q^7
12a_368 3*q^7*t + q^7 + q^5
12a_391 3*q^7*t + q^7 + q^5
12a_392 3*q^5*t + q^5 + q^3
12a_420 2*q^7*t + q^7 + q^5
12a_421 3*q^5*t + q^5 + q^3
12a_431 4*q^7*t + q^7 + q^5
12a_432 3*q^7*t + q^7 + q^5
12a_442 2*q^7*t + q^7 + q^5
12a_443 3*q^5*t + q^5 + q^3
12a_490 3*q^7*t + q^7 + q^5
12a_574 2*q^9*t + q^9 + q^7
12a_575 3*q^7*t + q^7 + q^5
12a_586 3*q^7*t + q^7 + q^5
12a_610 3*q^5*t + q^5 + q^3
12a_615 3*q^7*t + q^7 + q^5
12a_647 2*q^9*t + q^9 + q^7
12a_648 2*q^7*t + q^7 + q^5
12a_653 3*q^5*t + q^5 + q^3
12a_659 4*q^7*t + q^7 + q^5
12a_679 2*q^5*t + q^5 + q^3
12a_811 2*q^9*t + q^9 + q^7
12a_813 2*q^9*t + q^9 + q^7
12a_814 3*q^7*t + q^7 + q^5
12a_817 2*q^9*t + q^9 + q^7
12a_828 3*q^7*t + q^7 + q^5
12a_876 2*q^9*t + q^9 + q^7
12a_877 3*q^7*t + q^7 + q^5
12a_880 4*q^5*t + q^5 + q^3
12a_900 4*q^7*t + q^7 + q^5
12a_973 4*q^7*t + q^7 + q^5
12a_974 4*q^5*t + q^5 + q^3
12a_995 4*q^7*t + q^7 + q^5
12a_996 4*q^5*t + q^5 + q^3
12a_1004 4*q^7*t + q^7 + q^5
12a_1035 3*q^7*t + q^7 + q^5
12a_1037 4*q^5*t + q^5 + q^3
12a_1097 4*q^5*t + q^5 + q^3
12a_1112 4*q^7*t + q^7 + q^5
12a_1113 4*q^5*t + q^5 + q^3
12n_74 q^9*t + q^9 + q^7
12n_77 q^7*t + q^7 + q^5
12n_88 3*q^7*t + q^7 + q^5
12n_91 q^9 + q^7
12n_96 q^7*t + q^7 + q^5
12n_100 3*q^7*t + q^7 + q^5
12n_105 q^9 + q^7
12n_110 q^7*t + q^7 + q^5
12n_133 3*q^7*t + q^7 + q^5
12n_136 q^9 + q^7
12n_153 q^9*t + q^9 + q^7
12n_166 q^9*t + q^9 + q^7
12n_169 2*q^7*t + q^7 + q^5
12n_177 2*q^7*t + q^7 + q^5
12n_187 q^9 + q^7
12n_203 2*q^7*t + q^7 + q^5
12n_217 q^7*t + q^7 + q^5
12n_242 q^11 + q^9
12n_243 q^9*t + q^9 + q^7
12n_244 q^9*t + q^9 + q^7
12n_245 2*q^7*t + q^7 + q^5
12n_251 q^7*t + q^7 + q^5
12n_259 3*q^7*t + q^7 + q^5
12n_289 2*q^7*t + q^7 + q^5
12n_292 q^9*t + q^9 + q^7
12n_305 q^9*t + q^9 + q^7
12n_308 2*q^7*t + q^7 + q^5
12n_328 q^9 + q^7
12n_338 q^9*t + q^9 + q^7
12n_341 2*q^7*t + q^7 + q^5
12n_374 q^9*t + q^9 + q^7
12n_386 q^9*t + q^9 + q^7
12n_406 3*q^7*t + q^7 + q^5
12n_417 q^9 + q^7
12n_426 q^9 + q^7
12n_453 3*q^7*t + q^7 + q^5
12n_472 q^11 + q^9
12n_473 q^9*t + q^9 + q^7
12n_474 q^9*t + q^9 + q^7
12n_477 2*q^7*t + q^7 + q^5
12n_502 q^9*t + q^9 + q^7
12n_503 2*q^7*t + q^7 + q^5
12n_518 q^9 + q^7
12n_574 q^11 + q^9
12n_575 q^9*t + q^9 + q^7
12n_576 q^9*t + q^9 + q^7
12n_581 q^7*t + q^7 + q^5
12n_585 2*q^7*t + q^7 + q^5
12n_591 q^9 + q^7
12n_594 q^7*t + q^7 + q^5
12n_600 2*q^7*t + q^7 + q^5
12n_638 q^7*t + q^7 + q^5
12n_640 q^9 + q^7
12n_644 q^7*t + q^7 + q^5
12n_647 q^9 + q^7
12n_655 q^7*t + q^7 + q^5
12n_679 q^11 + q^9
12n_680 q^9*t + q^9 + q^7
12n_688 q^11 + q^9
12n_689 q^9*t + q^9 + q^7
12n_691 q^9*t + q^9 + q^7
12n_692 q^9*t + q^9 + q^7
12n_694 q^9 + q^7
12n_725 q^11 + q^9
12n_758 3*q^7*t + q^7 + q^5
12n_764 2*q^7*t + q^7 + q^5
12n_806 3*q^7*t + q^7 + q^5
12n_850 q^9 + q^7
12n_851 q^7*t + q^7 + q^5
12n_881 4*q^5*t + q^5 + q^3
12n_888 q^11 + q^9

Next, we check how strong our obstructions are. For that we look at the non-positive knots and print their Khovanov homology if it looks like the Khovanov homology of a positive knot.

In [7]:
for x in KNOTINFO:
    if x[3]!='Y':
        if KH_positivity_obstruction(x[4])!=False:
            [kh,fib,genus]=KH_positivity_obstruction(x[4])
            knot_floer=snappy.Manifold('K'+x[1].replace('_','')).link().knot_floer_homology()
            if fib==knot_floer.get('fibered'):
                if genus==knot_floer.get('seifert_genus'):
                    print(x[1],kh)
        if KH_positivity_obstruction(x[4](q^(-1),t^(-1),T))!=False:
            [kh,fib,genus]=KH_positivity_obstruction(x[4](q^(-1),t^(-1),T))
            knot_floer=snappy.Manifold('K'+x[1].replace('_','')).link().knot_floer_homology()
            if fib==knot_floer.get('fibered'):
                if genus==knot_floer.get('seifert_genus'):
                    print(x[1],kh)

Thus for the low-crossing knots (i.e. with crossing number at most 12) Khovanov homology detects positive knots.

We also observe from the KnotInfo data that such an obstruction might hold in reduced Khovanov homology and odd Khovanov homology.

We continue checking this for the census knots. We first prepare the data.

In [8]:
KHs=[]
with open('khovanov_most_recent.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        KHs.append([row[1],row[2]])
KHs=KHs[1:]
len(KHs)
Out[8]:
672
In [9]:
S.<q,t> = LaurentPolynomialRing(ZZ,2); # We set up the polynomial ring:

KH=[]
for [name,s] in KHs:
    KH.append([name,S(eval(s.replace('^','**')))]) #different sign convention
len(KH)
Out[9]:
672
In [10]:
fibered=[]
with open('fibered.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        fibered.append([row[0],row[1]])
fibered=fibered[1:]
len(fibered)
Out[10]:
1267
In [11]:
positive=[]
with open('positivity.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        positive.append([row[0],row[1]])
positive=positive[1:]
len(positive)
Out[11]:
1267
In [12]:
Seifert_genus=[]
with open('3genus.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        Seifert_genus.append([row[0],row[1]])
Seifert_genus=Seifert_genus[1:]
len(Seifert_genus)
Out[12]:
1267
In [13]:
CENSUS_KNOTS=[]
for x in KH:
    for y in fibered:
        if x[0]==y[0]:
            break
    for z in positive:
        if x[0]==z[0]:
            break
    for g in Seifert_genus:
        if g[0]==x[0]:
            break
    CENSUS_KNOTS.append([x[0],z[1],y[1],g[1],x[1]]) #name,pos,fib,genus,KH
len(CENSUS_KNOTS)
Out[13]:
672
In [14]:
def KH_positivity_obstruction(KH_poly):
    '''If K is a positive knot the following properties are known about its Khovanov homologies KH^(i,j):
    (1) KH^(i,j)=0 if i<0
    (2) KH^(0,2g-1)=F where g is the genus of K (for a link -Eulercharacteristic)
    (3) KH^(0,2g+1)=F 
    (4) KH^(1,2g+1)=F^p1 where p1 is the chromatic number of the reduced Seifert graph of a positive diagram
    (5) KH^(1,2g+1)=0 if and only if K is fibered
    (6) KH^(0,j)=0 for all other j
    (7) KH^(1,j)=0 for all other j
    (8) KH^(i,2g-1)=0 for all other i
    (9) KH^(0,2g+1)=0 for all other i
    
    This function takes as input a Khovanov polynomial of a knot. And outputs False if any of these conditins 
    is not fulfilled. (Except for checking that the genus is correct and the fiberedness condition.)
    Otherwise it will print the above non-vanishing terms, together with its possible fiberedness status, and genus. 
    By computing the fiberedness status and the genus 
    (for example by computing the knot Floer homology) the above obstructions can sometimes be improved.
    '''
    fiberedness=None
    poly=S(KH_poly.dict())
    try:
        kh=t*poly.derivative(t)(q,0)+poly(q,0)
    except ZeroDivisionError:
        return False
    exp=kh.exponents()
    if len(exp)>3:
        return False
    if len(exp)<2:
        return False
    if len(exp)==3:
        fiberedness=False
        g=int((exp[2][0]+1)/2)
        if exp[2][1]!=0:
            return False
        if exp[1][1]!=0:
            return False
        if exp[1][0]!=2*g+1:
            return False
        if exp[0][0]!=2*g+1:
            return False
        if exp[0][1]!=1:
            return False
    if len(exp)==2:
        fiberedness=True
        g=int((exp[1][0]+1)/2)
        if exp[1][1]!=0:
            return False
        if exp[0][1]!=0:
            return False
        if exp[0][0]!=2*g+1:
            return False
    pol=poly
    for count in range(0,2*g-1):
        pol=pol.derivative(q)
    try:
        qmin=q**(2*g-1)*pol(0,t)
    except ZeroDivisionError:
        return False
    if len(qmin.exponents())!=1:
        return False
    pol=pol.derivative(q)
    pol=pol.derivative(q)
    try:
        qalmmin=q**(2*g+1)*pol(0,t)
    except ZeroDivisionError:
        return False
    if fiberedness:
        if len(qalmmin.exponents())!=1:
            return False
    if fiberedness==False:
        if len(qalmmin.exponents())!=2:
            return False
    return [kh,fiberedness,g]
    
    
In [15]:
def KH1(KH_poly):
    '''Returns KH in homological grading 1 (if KH is non-negative).'''
    try:
        return KH_poly.derivative(t)(q,0)
    except ZeroDivisionError:
        return False

We start by verifying the obstruction for the positive census knots:

In [16]:
for x in CENSUS_KNOTS:
    if x[1]=='True':
        if KH_positivity_obstruction(x[4])==False:
            if KH_positivity_obstruction(x[4](q^(-1),t^(-1)))==False:
                print('Obstruction is NOT working for:',x[0])
            else:
                [kh,fib,genus]=KH_positivity_obstruction(x[4](q^(-1),t^(-1)))
        else:
            [kh,fib,genus]=KH_positivity_obstruction(x[4])
        if x[2]!=str(fib):
            print('Obstruction is NOT working for:',x[0])
        if x[3]!=str(genus):
            print('Obstruction is NOT working for:',x[0])
        print(x[0],kh)
m016 q^11 + q^9
m082 q^17 + q^15
m118 q^21 + q^19
m071 q^23 + q^21
m103 q^31 + q^29
m144 q^23 + q^21
m194 q^27 + q^25
m198 q^27 + q^25
m211 q^19 + q^17
m223 q^13 + q^11
m239 q^23 + q^21
m240 q^25 + q^23
m270 q^33 + q^31
m276 q^37 + q^35
m281 q^33 + q^31
m389 q^9 + q^7
s042 q^43 + q^41
s068 q^51 + q^49
s086 q^29 + q^27
s104 q^53 + q^51
s294 q^35 + q^33
s301 q^47 + q^45
s308 q^47 + q^45
s336 q^35 + q^33
s344 q^49 + q^47
s346 q^57 + q^55
s367 q^45 + q^43
s369 q^55 + q^53
s384 q^15 + q^13
s407 q^59 + q^57
s560 q^31 + q^29
s582 q^37 + q^35
s652 q^19 + q^17
s665 q^57 + q^55
s682 q^19 + q^17
s684 q^41 + q^39
s800 q^53 + q^51
s841 q^15 + q^13
s849 q^27 + q^25
v0082 q^63 + q^61
v0165 q^35 + q^33
v0249 q^33 + q^31
v0319 q^49 + q^47
v0330 q^47 + q^45
v0545 q^29 + q^27
v0554 q^51 + q^49
v0570 q^67 + q^65
v0573 q^67 + q^65
v0707 q^47 + q^45
v0709 q^45 + q^43
v0740 q^57 + q^55
v0830 q^39 + q^37
v0939 q^55 + q^53
v0959 q^17 + q^15
v1359 q^45 + q^43
v1392 q^51 + q^49
v1423 q^39 + q^37
v1425 q^31 + q^29
v1547 q^57 + q^55
v1565 q^43 + q^41
v1620 q^49 + q^47
v1728 q^57 + q^55
v1810 q^77 + q^75
v1915 q^25 + q^23
v1980 q^35 + q^33
v2166 q^7 + q^5
v2191 q^21 + q^19
v2215 q^61 + q^59
v2217 q^21 + q^19
v2290 q^39 + q^37
v2325 q^73 + q^71
v2384 q^21 + q^19
v2553 q^7*t + q^7 + q^5
v2624 q^9*t + q^9 + q^7
v2642 q^11 + q^9
v2851 q^17 + q^15
v2871 q^17 + q^15
v2900 q^47 + q^45
v2925 q^25 + q^23
v3070 q^53 + q^51
v3081 q^15 + q^13
v3105 q^29 + q^27
v3199 q^15 + q^13
v3234 q^31 + q^29
v3335 q^31 + q^29
v3356 q^17 + q^15
v3482 q^39 + q^37
t00110 q^83 + q^81
t00146 q^91 + q^89
t00324 q^41 + q^39
t01033 q^87 + q^85
t01037 q^87 + q^85
t01422 q^59 + q^57
t01440 q^69 + q^67
t01815 q^53 + q^51
t01966 q^59 + q^57
t02099 q^75 + q^73
t02276 q^19 + q^17
t03710 q^55 + q^53
t03781 q^61 + q^59
t03843 q^49 + q^47
t04019 q^65 + q^63
t04180 q^97 + q^95
t04449 q^37 + q^35
t04557 q^31 + q^29
t04986 q^27 + q^25
t05538 q^81 + q^79
t05695 q^93 + q^91
t06573 q^23 + q^21
t06715 q^33 + q^31
t06925 q^13 + q^11
t07070 q^33 + q^31
t07104 q^27 + q^25
t07123 q^15*t + q^15 + q^13
t07355 q^29 + q^27
t07412 q^49 + q^47
t07670 q^39 + q^37
t07944 q^37 + q^35
t07979 q^9 + q^7
t08111 q^55 + q^53
t08114 q^25 + q^23
t08273 q^43 + q^41
t08532 q^43 + q^41
t08767 q^45 + q^43
t08838 q^29 + q^27
t08898 q^35 + q^33
t08936 q^47 + q^45
t08973 q^27 + q^25
t09126 q^59 + q^57
t09279 q^23 + q^21
t09284 q^21 + q^19
t09359 q^9*t + q^9 + q^7
t09450 q^55 + q^53
t09500 q^37 + q^35
t09633 q^37 + q^35
t09772 q^17 + q^15
t09847 q^15 + q^13
t09859 q^7*t + q^7 + q^5
t09882 q^19 + q^17
t09912 q^43 + q^41
t10188 q^43 + q^41
t10215 q^37 + q^35
t10224 q^33 + q^31
t10262 q^39 + q^37
t10292 q^47 + q^45
t10407 q^21 + q^19
t10496 q^25 + q^23
t10664 q^25 + q^23
t10832 q^35 + q^33
t10944 q^29 + q^27
t11055 q^17 + q^15
t11198 q^53 + q^51
t11292 q^11*t + q^11 + q^9
t11333 q^29 + q^27
t11376 q^41 + q^39
t11460 q^27 + q^25
t11548 q^51 + q^49
t11556 q^51 + q^49
t11558 q^29 + q^27
t11751 q^7*t + q^7 + q^5
t11798 q^9*t + q^9 + q^7
t11887 q^51 + q^49
t11909 q^41 + q^39
t12154 q^13 + q^11
t12198 q^13 + q^11
t12199 q^15 + q^13
t12229 q^25 + q^23
t12247 q^11 + q^9
t12456 q^27 + q^25
t12533 q^25 + q^23
t12681 q^45 + q^43
t12756 q^11 + q^9
t12755 q^17 + q^15
o9_00133 q^103 + q^101
o9_00168 q^111 + q^109
o9_00644 q^47 + q^45
o9_01936 q^45 + q^43
o9_01955 q^107 + q^105
o9_02786 q^71 + q^69
o9_02794 q^81 + q^79
o9_02909 q^41 + q^39
o9_04060 q^79 + q^77
o9_05287 q^21 + q^19
o9_08402 q^67 + q^65
o9_08477 q^73 + q^71
o9_09052 q^57 + q^55
o9_09213 q^117 + q^115
o9_10020 q^37 + q^35
o9_10598 q^33 + q^31
o9_11541 q^43 + q^41
o9_12253 q^69 + q^67
o9_12519 q^101 + q^99
o9_12693 q^85 + q^83
o9_12757 q^113 + q^111
o9_15808 q^55 + q^53
o9_16685 q^25 + q^23
o9_16991 q^21*t + q^21 + q^19
o9_17646 q^41 + q^39
o9_18181 q^19 + q^17
o9_18341 q^33 + q^31
o9_18646 q^53 + q^51
o9_19364 q^29 + q^27
o9_19396 q^39 + q^37
o9_20305 q^63 + q^61
o9_21496 q^59 + q^57
o9_21545 q^13*t + q^13 + q^11
o9_21722 q^19*t + q^19 + q^17
o9_21905 q^13*t + q^13 + q^11
o9_21918 q^75 + q^73
o9_22148 q^41 + q^39
o9_22266 q^39 + q^37
o9_23032 q^43 + q^41
o9_23069 q^15*t + q^15 + q^13
o9_23179 q^79 + q^77
o9_23646 q^25 + q^23
o9_23971 q^61 + q^59
o9_24290 q^49 + q^47
o9_24401 q^39 + q^37
o9_24510 q^55 + q^53
o9_24779 q^79 + q^77
o9_24946 q^45 + q^43
o9_25199 q^51 + q^49
o9_25341 q^49 + q^47
o9_25444 q^55 + q^53
o9_25709 q^27 + q^25
o9_25832 q^55 + q^53
o9_26471 q^49 + q^47
o9_26767 q^31 + q^29
o9_26913 q^21 + q^19
o9_27046 q^57 + q^55
o9_27107 q^47 + q^45
o9_27243 q^23 + q^21
o9_27889 q^35 + q^33
o9_28070 q^27 + q^25
o9_28230 q^19 + q^17
o9_29048 q^35 + q^33
o9_29141 q^11 + q^9
o9_29278 q^45 + q^43
o9_29367 q^23 + q^21
o9_29484 q^49 + q^47
o9_29766 q^37 + q^35
o9_29799 q^29 + q^27
o9_30040 q^15*t + q^15 + q^13
o9_30281 q^33 + q^31
o9_30324 q^35 + q^33
o9_30499 q^13 + q^11
o9_30650 q^43 + q^41
o9_30978 q^31 + q^29
o9_31036 q^11*t + q^11 + q^9
o9_31228 q^23 + q^21
o9_31321 q^41 + q^39
o9_31692 q^41 + q^39
o9_31935 q^13 + q^11
o9_31955 q^19 + q^17
o9_31967 q^47 + q^45
o9_32044 q^29 + q^27
o9_32150 q^63 + q^61
o9_32471 q^57 + q^55
o9_32588 q^63 + q^61
o9_32964 q^37 + q^35
o9_33189 q^53 + q^51
o9_33363 q^9 + q^7
o9_33380 q^41 + q^39
o9_33430 q^51 + q^49
o9_33470 q^39 + q^37
o9_33529 q^23 + q^21
o9_33944 q^53 + q^51
o9_33950 q^25 + q^23
o9_34316 q^15 + q^13
o9_34409 q^31 + q^29
o9_34450 q^17*t + q^17 + q^15
o9_34671 q^15*t + q^15 + q^13
o9_34689 q^71 + q^69
o9_35376 q^37 + q^35
o9_35666 q^69 + q^67
o9_35720 q^61 + q^59
o9_35778 q^9*t + q^9 + q^7
o9_35831 q^49 + q^47
o9_35928 q^45 + q^43
o9_35997 q^7*t + q^7 + q^5
o9_36089 q^9*t + q^9 + q^7
o9_36250 q^65 + q^63
o9_36297 q^45 + q^43
o9_36411 q^45 + q^43
o9_36435 q^21 + q^19
o9_36809 q^45 + q^43
o9_36811 q^35 + q^33
o9_36958 q^45 + q^43
o9_37142 q^13 + q^11
o9_37162 q^11 + q^9
o9_37551 q^37 + q^35
o9_37685 q^45 + q^43
o9_37891 q^31 + q^29
o9_38287 q^59 + q^57
o9_38344 q^45 + q^43
o9_38598 q^37 + q^35
o9_38928 q^39 + q^37
o9_38945 q^23 + q^21
o9_38989 q^67 + q^65
o9_39162 q^49 + q^47
o9_39592 q^35 + q^33
o9_39606 q^47 + q^45
o9_39608 q^47 + q^45
o9_39879 q^43 + q^41
o9_39926 q^41 + q^39
o9_39981 q^39 + q^37
o9_40026 q^39 + q^37
o9_40073 q^29 + q^27
o9_40075 q^73 + q^71
o9_40154 q^17 + q^15
o9_40215 q^19 + q^17
o9_40487 q^29 + q^27
o9_40504 q^43 + q^41
o9_40582 q^33 + q^31
o9_40901 q^45 + q^43
o9_41144 q^47 + q^45
o9_41372 q^69 + q^67
o9_41428 q^29 + q^27
o9_41610 q^11*t + q^11 + q^9
o9_42189 q^9*t + q^9 + q^7
o9_42224 q^61 + q^59
o9_42352 q^33 + q^31
o9_42411 q^9*t + q^9 + q^7
o9_42430 q^21 + q^19
o9_42675 q^33 + q^31
o9_42757 q^27 + q^25
o9_42961 q^43 + q^41
o9_42974 q^7*t + q^7 + q^5
o9_43443 q^17 + q^15
o9_43567 q^19 + q^17
o9_43609 q^9 + q^7
o9_43607 q^19 + q^17
o9_43649 q^27 + q^25
o9_43759 q^23 + q^21

Next, we check our obstructions on the knots with previously unknown positivity status:

In [17]:
for x in CENSUS_KNOTS:
    if x[1]=='':
        print(x[0])
        obs=False
        if KH_positivity_obstruction(x[4])==False:
            if KH_positivity_obstruction(x[4](q^(-1),t^(-1)))==False:
                print('is NOT positive, since Khovanov homology has the wrong form. It is:')
                print(x[4])
                obs=True
            else:
                [kh,fib,genus]=KH_positivity_obstruction(x[4](q^(-1),t^(-1)))
        else:
            [kh,fib,genus]=KH_positivity_obstruction(x[4])
        if obs==False:
            print('has KH in degree 0 and 1:',kh)
            print('Seifert genus:',x[3])
            print('Fiberedness status:',x[2])
            if x[3]!=str(genus):
                print('is NOT positive since its Seifert genus is:',x[3])
            if x[2]!=str(fib):
                print('is NOT positive since its fiberedness status is:',x[2])
        print('------------------')
v1964
has KH in degree 0 and 1: q^5 + q^3
Seifert genus: 2
Fiberedness status: False
is NOT positive since its fiberedness status is: False
------------------
v2743
is NOT positive, since Khovanov homology has the wrong form. It is:
2*q^-1 + q^-3 + q^-3*t^-1 + q^-5*t^-1 + q^-5*t^-2 + q^-7*t^-2 + q^-7*t^-3 + q^-9*t^-3 + q^-9*t^-4 + q^-9*t^-5 + q^-11*t^-4 + q^-11*t^-7 + q^-13*t^-5 + q^-13*t^-6 + 2*q^-15*t^-8 + q^-15*t^-9 + q^-17*t^-10 + q^-19*t^-9 + q^-19*t^-10 + q^-21*t^-11 + q^-21*t^-12 + q^-25*t^-13
------------------
t04651
has KH in degree 0 and 1: q^5*t + q^5 + q^3
Seifert genus: 2
Fiberedness status: False
------------------
t12308
has KH in degree 0 and 1: q^11 + q^9
Seifert genus: 5
Fiberedness status: True
------------------
o9_09214
has KH in degree 0 and 1: q^5*t + q^5 + q^3
Seifert genus: 2
Fiberedness status: False
------------------
o9_24667
has KH in degree 0 and 1: q^7*t + q^7 + q^5
Seifert genus: 3
Fiberedness status: False
------------------
o9_25096
has KH in degree 0 and 1: q^7*t + q^7 + q^5
Seifert genus: 3
Fiberedness status: False
------------------
o9_30634
has KH in degree 0 and 1: q^13 + q^11
Seifert genus: 6
Fiberedness status: True
------------------
o9_31294
has KH in degree 0 and 1: q^17 + q^15
Seifert genus: 8
Fiberedness status: True
------------------
o9_34097
has KH in degree 0 and 1: q^5 + q^3
Seifert genus: 2
Fiberedness status: False
is NOT positive since its fiberedness status is: False
------------------

So this obstructs 3 knots from being positive for which all previously known obstructions where not working:

v1964 is not positive since it is not fibered but its first Khovanov homology is 0.

v2743 is not positive since its Khovanov homology has the wrong form.

o9_34097 is not positive since it is not fibered but its first Khovanov homology is 0.

We check also how strong the obstruction is on the other census knots that are known to be non-positive.

In [18]:
for x in CENSUS_KNOTS:
    if x[1]=='False':
        if KH_positivity_obstruction(x[4])!=False:
            [kh,fib,genus]=KH_positivity_obstruction(x[4])
            if str(fib)==x[2]:
                if str(genus)==x[3]:
                    print(x[0])
                    print('has KH in degree 0 and 1:',kh)
                    print('Seifert genus:',x[3])
                    print('and fiberedness status:',x[2])
                    print('------------------------')
        if KH_positivity_obstruction(x[4](q^(-1),t^(-1)))!=False:
            [kh,fib,genus]=KH_positivity_obstruction(x[4](q^(-1),t^(-1)))
            if str(fib)==x[2]:
                if str(genus)==x[3]:
                    print(x[0])
                    print('has KH in degree 0 and 1:',kh)
                    print('Seifert genus:',x[3])
                    print('and fiberedness status:',x[2])
                    print('------------------------')
o9_22182
has KH in degree 0 and 1: q^7 + q^5
Seifert genus: 3
and fiberedness status: True
------------------------
o9_35678
has KH in degree 0 and 1: q^9 + q^7
Seifert genus: 4
and fiberedness status: True
------------------------
o9_39519
has KH in degree 0 and 1: q^7 + q^5
Seifert genus: 3
and fiberedness status: True
------------------------
s580
has KH in degree 0 and 1: q^5 + q^3
Seifert genus: 2
and fiberedness status: True
------------------------
t08387
has KH in degree 0 and 1: q^7 + q^5
Seifert genus: 3
and fiberedness status: True
------------------------
o9_19200
has KH in degree 0 and 1: q^11 + q^9
Seifert genus: 5
and fiberedness status: True
------------------------
o9_38702
has KH in degree 0 and 1: q^7 + q^5
Seifert genus: 3
and fiberedness status: True
------------------------
o9_41263
has KH in degree 0 and 1: q^9 + q^7
Seifert genus: 4
and fiberedness status: True
------------------------
o9_43369
has KH in degree 0 and 1: q^5*t + q^5 + q^3
Seifert genus: 2
and fiberedness status: False
------------------------

I.e. Khovanov homology obstructs among the positive census knots with known Khovanov homology all but 9 knots from being positive.